iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0
DevOps

第一次參賽就學 Kubernetes系列 第 27

[Day 27] Namespaces

  • 分享至 

  • xImage
  •  

在前面二十幾天的介紹,我似乎忘了很重要的一個物件 Namespac。


Namespaces

k8s 使用 namespaces 來管理資源,以此作為資源隔離的方法。我們也可以透過 namespace 將其叢集劃分成不同的虛擬子叢集。

namespaces 僅適用於 pods、deployment 與 services 等 namespaces 物件,不適用於 cluster-wide(叢集範圍)物件,如 persisten volume 與 node。

查詢不適用 namespaces 的資源:kubectl api-resources --namespaced=false
查詢適用 namespace 的資源:kubectl api-resources --namespaced=true

查看叢集中的 namespaces。

kubectl get ns

NAME              STATUS   AGE
default           Active   20d
kube-node-lease   Active   20d
kube-public       Active   20d
kube-system       Active   20d

叢集一開始就有四個預設的 namespaces:

  • kube-system:主要用於 k8s 建立的系統程序與物件,一般不會去動到這個 namespace 的物件。
  • kube-pulic:所有使用者皆可存取該 namespace 的資源。
  • kube-node-lease:主要是與 node 相關的 lease object,lease object 用於定期監控節點狀態。
  • default:若沒有建立新的 namespace,一開始建立的資源其 namespace 自動設為 default。

Namespaces 用途

  1. 方便管理,將相關的資源 group 到同個 namespaces 便於管理。例如將 log 相關或是監控相關的資源 group 在同個 namespaces
  2. 避免資源互相干擾。相同 namespaces 的資源名稱需唯一,若是將所有資源散落在 default namespaces 相似的資源將難以去辨識及操作
  3. 限制資源存取。在上篇有提到叢集使用 RBAC 管理資源的存取權限,在 Role 的定義中就會使用 namespaces 去指定是哪個 namespaces 下的資源可以進行存取

Namespaces 操作

建立 namespaces 有兩種方式:

  1. 直接透過指令
  2. YAML 設定檔

1. 直接透過指令

建立一個 namespace 為 develop。

kubectl create namespace develop

kubectl get ns
NAME              STATUS   AGE
default           Active   20d
develop           Active   4s
kube-node-lease   Active   20d
kube-public       Active   20d
kube-system       Active   20d

2. YAML 設定檔

以下為 ns-develop.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: develop
  labels:
    name: develop

執行以下指令建立 namespace。

kubectl create -f ns-develop.yaml

為資源設定 namespace

以下建立一個 image 為 nginx 的 pod 並設定 namespace 為 develop。

kubectl run nginx --image=nginx --namespace=develop

pod/nginx created

或是在 pod.yaml 中註明其 namespace。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: develop
spec:
  containers:
  - image: nginx
    name: nginx

建立 namespace。

kubectl create -f pod.yaml

pod/nginx created

查看該資源。

kubectl get po -n develop

NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          70s

刪除 namespace

執行以下指令。

kubectl delete ns develop

namespace "develop" deleted

設定常用 namespace

因每次查看 namespaces 中的資源其指令都需要填上 -n namespace-name,我們可以透過以下指令將後續的情境(context)都設定在某 namespace 上,就不需要每次指令都要填上 -n 參數。

kubectl config set-context --current --namespace=develop

Context "minikube" modified.

測試一下。

kubectl config view --minify | grep namespace:
    namespace: develop

查看該 pod 的 namespace。

kubectl get pod nginx -o yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2023-10-12T15:45:23Z"
  name: nginx
  namespace: develop
  resourceVersion: "65133"
  ...

參考來源

  1. Kubernetes Namespaces Explained in 15 mins | Kubernetes Tutorial 21
  2. Kubernetes - Namespaces

上一篇
[Day 26] Authentication - Role Based Access Control (RBAC)
下一篇
[Day 28] 使用 Jenkins 建置 CI/CD Pipeline 專案 (一)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言